/*
 *  Matrice.hpp
 *  
 *
 *  Created by Hélène Beaumont on 12/12/08.
 *  Copyright 2008 Personnel. All rights reserved.
 *
 */


#include <iostream>

#include "Polynome.hpp"


using namespace std;
// Première case de la matrice (0 ; 0)
class Factor;

class Matrice
{
   protected :
      bool   * _matrice;
      int      _nbLignes;
      int      _nbColonnes;
      bool   * _vectFree;


   
   public :
      Matrice(int inNbLignes, int inNbColonnes)
      {
         _nbLignes = inNbLignes;
         _nbColonnes = inNbColonnes;
         
         _matrice = new bool[ inNbLignes * inNbColonnes ];
         
         for( int i = 0 ; i < _nbLignes * _nbColonnes ; i++)
         {
            _matrice[i] = 0;
         }
         
         _vectFree = new bool[inNbColonnes];
      }
   
   
      Matrice(int inNbLignes, int inNbColonnes, bool * inTableau)
   :  _nbLignes(inNbLignes), _nbColonnes(inNbColonnes)
      {
         _matrice = new bool[ _nbLignes * _nbColonnes ];
         for( int i = 0 ; i < _nbLignes * _nbColonnes ; i++)
         {
            _matrice[i] = inTableau[i];
         }
         _vectFree = new bool[_nbColonnes];
      }
   
      ~Matrice()
      { 
         delete [] _matrice;
         delete [] _vectFree;
      }
   
      // Voir pour un constructeur de copier et la surcharge de l'opérateur =
   
      // Getters
      bool  getMatrice(int inX, int inY) const { return _matrice[ inX * _nbColonnes + inY ]; }
      int   getNbColonnes() const { return _nbColonnes; }
      int   getNbLignes() const { return _nbLignes; }
   
      // Setters
      void setMatrice(int inX, int inY, bool inVal) { _matrice[ inX * _nbColonnes + inY] = inVal; }
      
      bool swapLignes(int inLigne1, int inLigne2)
      {
         // Si les lignes existent
         if(inLigne1 >=0 && inLigne1 < _nbLignes && inLigne2 >=0 && inLigne2 < _nbLignes)
         {
            bool  sauv;
            for(int i = 0 ; i < _nbColonnes ; i++)
            {
               sauv = _matrice[ inLigne1 * _nbColonnes + i ];
               _matrice[ inLigne1 * _nbColonnes + i ] = _matrice[ inLigne2 * _nbColonnes + i ];
               _matrice[ inLigne2 * _nbColonnes + i ] = sauv;
            }
            return true;
         }
         else return false;
      }
      
      Matrice trans();
   
      void buildMatrix(Factor & RFB, Factor & AFB, Factor & QCB, Factor & pairesAB, Polynome & p);
      
      // i = i -j
      void sub(int inI, int inJ);
      
      // Soustraie la ligne i a toutes les lignes en dessous de i
      void supUnder(int inI);
      
      
     // Soustraie la ligne i a toutes les lignes au dessus de i
      void supOver(int inJ, int inK);
      
      void generateFile();
      
      bool * Gauss();
      
      friend ostream & operator<< (ostream & o, const Matrice & inMatrice);
   
      
   
};


